import { Injectable } from '@nestjs/common';
import { Request } from 'express';
import { LogService } from '../log.service';
import { LogLevel } from '../dto/create-log.dto';

/**
 * 日志使用示例
 * 展示如何在业务服务中集成日志功能
 */
@Injectable()
export class LogUsageExample {
  constructor(private readonly logService: LogService) {}

  /**
   * 示例1: 记录用户登录日志
   */
  async logUserLogin(username: string, success: boolean, req: Request) {
    if (success) {
      await this.logService.logInfo(
        `用户 ${username} 登录成功`,
        'auth',
        req
      );
    } else {
      await this.logService.logError(
        new Error(`用户 ${username} 登录失败`),
        'auth',
        req
      );
    }
  }

  /**
   * 示例2: 记录业务操作日志
   */
  async logBusinessOperation(operation: string, details: any, req: Request) {
    await this.logService.logInfo(
      `业务操作: ${operation} - ${JSON.stringify(details)}`,
      'business',
      req
    );
  }

  /**
   * 示例3: 记录系统警告
   */
  async logSystemWarning(message: string, req?: Request) {
    const logData = {
      method: 'SYSTEM',
      url: 'SYSTEM',
      level: LogLevel.WARN,
      errorMessage: message,
      module: 'system',
      action: 'warning',
    };

    if (req) {
      logData.method = req.method;
      logData.url = req.originalUrl;
    }

    await this.logService.create(logData);
  }

  /**
   * 示例4: 在异常处理中记录日志
   */
  async handleError(error: Error, context: string, req?: Request) {
    // 记录错误日志
    await this.logService.logError(error, context, req);
    
    // 可以在这里添加其他错误处理逻辑
    // 比如发送邮件通知、记录到外部日志系统等
  }

  /**
   * 示例5: 记录性能监控日志
   */
  async logPerformance(operation: string, duration: number, req: Request) {
    if (duration > 1000) { // 超过1秒的操作记录为警告
      await this.logService.logError(
        new Error(`操作 ${operation} 执行时间过长: ${duration}ms`),
        'performance',
        req
      );
    } else {
      await this.logService.logInfo(
        `操作 ${operation} 执行完成，耗时: ${duration}ms`,
        'performance',
        req
      );
    }
  }
}

/**
 * 在控制器中使用日志的示例
 */
export class ExampleController {
  constructor(private readonly logService: LogService) {}

  /**
   * 示例: 在控制器方法中使用日志
   */
  async exampleMethod(req: Request) {
    try {
      // 业务逻辑
      const result = await this.someBusinessLogic();
      
      // 记录成功日志
      await this.logService.logInfo(
        '业务操作执行成功',
        'example',
        req
      );
      
      return result;
    } catch (error) {
      // 记录错误日志
      await this.logService.logError(error, 'example', req);
      throw error;
    }
  }

  private async someBusinessLogic() {
    // 模拟业务逻辑
    return { success: true };
  }
}
